package com.dl.filter;

import com.dl.utils.ApplicationContextUtils;
import com.dl.utils.ConstantField;
import lombok.extern.log4j.Log4j2;
import org.apache.shiro.session.ExpiredSessionException;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.UnknownSessionException;
import org.apache.shiro.session.mgt.DefaultSessionKey;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.data.redis.core.RedisTemplate;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.util.*;

/**
 * 记住我过滤器
 * @author DL
 * @create 2021-06-15 15:20
 */
@Log4j2
@SuppressWarnings("unchecked")
public class RememberMeFilter extends AccessControlFilter {


    private RedisTemplate<String, String> getRedisTemplate(){
        //获取redis操作对象
        return (RedisTemplate<String, String>) ApplicationContextUtils.getBean("redisTemplate");
    }

    //表示是否允许访问；mappedValue就是[urls]配置中拦截器参数部分，如果允许访问返回true，否则false；
    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
        return false;
    }

    //表示访问拒绝时是否自己处理，如果返回true表示自己不处理且继续拦截器链执行，返回false表示自己已经处理了（比如重定向到另一个页面）。
    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) {

        // 1.判断是否是登录用户
        Subject subject = getSubject(request, response);
        if(!subject.isAuthenticated() && !subject.isRemembered()) {
            //如果没有登录，直接进行之后的流程
            return true;
        }


        return true;
    }
}
